#include "convert.h"


// 灰度图从左上角裁剪并转换为NV12格式（单循环优化版本）
void grey_to_nv12(unsigned char* src_grey, unsigned char* dst_nv12, 
                  int src_width, int src_height, int dst_width, int dst_height) 
{
    // 参数验证
    if (!src_grey || !dst_nv12 || 
        src_width <= 0 || src_height <= 0 || 
        dst_width <= 0 || dst_height <= 0) {
        perror("Invalid buffer or parameters");
        return;
    }
    
    // 确保源图像尺寸足够大以进行裁剪
    if (src_width < dst_width || src_height < dst_height) {
        perror("Source image is smaller than the desired crop size");
        return;
    }
    
    // 计算Y平面和UV平面的总大小
    const int y_size = dst_width * dst_height;
    const int uv_size = y_size / 2; // NV12格式中UV平面占Y平面的一半
    
    // 初始化指针
    unsigned char* y_plane = dst_nv12;
    unsigned char* uv_plane = dst_nv12 + y_size;
    
    // UV分量的中性灰度值
    const unsigned char uv_value = 128;
    
    // 单循环处理Y和UV平面
    for (int y = 0; y < dst_height; y++) {
        // 处理Y平面（整行复制）
        const unsigned char* src_row = &src_grey[y * src_width];
        unsigned char* dst_y_row = &y_plane[y * dst_width];
        memcpy(dst_y_row, src_row, dst_width);
        
        // 处理UV平面（每两行处理一次）
        if ((y % 2) == 0) {
            int uv_y = y / 2;
            for (int x = 0; x < dst_width; x += 2) {
                int uv_index = uv_y * dst_width + x;
                uv_plane[uv_index] = uv_value;     // U分量
                uv_plane[uv_index + 1] = uv_value; // V分量
            }
        }
    }
}